/*
 * Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 * for details. All rights reserved. Use of this source code is governed by a
 * BSD-style license that can be found in the LICENSE file.
 */
/**
 * @assertion A conditional expression c of the form e1 ? e2 : e3.
 * If all of the following hold:
 * - e1 shows that a variable v has type T.
 * - v is not potentially mutated in e2 or within a closure.
 * - If the variable v is accessed by a closure in e2 then the variable v is
 * not potentially mutated anywhere in the scope of v .
 * then the type of v is known to be T in e2 .
 * @description Checks that if e1 shows that v has type T, v2 is not potentially
 * mutated in e2, but potentially mutated within a closure, then the type of v
 * is not known to be T in e2.
 * @static-warning
 * @author ilya
 */
import "../../Utils/expect.dart";

var closure;

class C {}
class D extends C {
  f() => closure(); 
}

f(C x) {
  closure = () => x = new C();

  x is D ? [x.f(), x.f() /*throws*/] : null;
}

main() {
  Expect.throws(() => f(new D()));
}
